lm-sensors: fix build with glibc
authorJohn Audia <[email protected]>
Sat, 16 Aug 2025 10:44:45 +0000 (06:44 -0400)
committerRobert Marko <[email protected]>
Mon, 25 Aug 2025 15:29:59 +0000 (17:29 +0200)
The lm-sensors build was failing on glibc-based targets with:
  ld: cannot find -liconv: No such file or directory

which occurred because the upstream Makefile unconditionally links
against -liconv, but glibc has iconv functionality built-in and does not
provide a separate libiconv library.

I submitted the new patch upstream to fix this:
https://github.com/hramrach/lm-sensors/pull/14

This change is backward compatible based on my testing building
lm-sensors for x86/64 with glibc and again with musl after having
applied the patch.

Build system: x86/64
Build-tested: x86/64-glibc and x86/64
Run-tested: x86/64-glibc (Intel N150 based box)

Signed-off-by: John Audia <[email protected]>
utils/lm-sensors/Makefile
utils/lm-sensors/patches/100-Fix-iconv-linking-detection-for-glibc-based-builds.patch [new file with mode: 0644]

index 450879353a753ffbf7fac91b09c54d3b3d0baa56..69bbfef85c0bef3b9339f5b744f14ca82889a1d8 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=lm-sensors
 PKG_VERSION:=3.6.2
-PKG_RELEASE:=2
+PKG_RELEASE:=3
 
 PKG_VERSION_SUBST=$(subst .,-,$(PKG_VERSION))
 PKG_SOURCE_URL:=https://codeload.github.com/hramrach/lm-sensors/tar.gz/V$(PKG_VERSION_SUBST)?
diff --git a/utils/lm-sensors/patches/100-Fix-iconv-linking-detection-for-glibc-based-builds.patch b/utils/lm-sensors/patches/100-Fix-iconv-linking-detection-for-glibc-based-builds.patch
new file mode 100644 (file)
index 0000000..6b227bb
--- /dev/null
@@ -0,0 +1,62 @@
+From 2c14facc904d531ae9ae98705322916668793784 Mon Sep 17 00:00:00 2001
+From: graysky <therealgraysky AT proton DOT me>
+Date: Sat, 16 Aug 2025 07:01:21 -0400
+Subject: [PATCH] Fix iconv linking detection for glibc-based builds
+
+The current iconv detection checks if libiconv.so exists via ldconfig,
+but fails on glibc systems where iconv is built into libc and doesn't
+require separate linking. This causes build failures:
+
+  ld: cannot find -liconv: No such file or directory
+
+Replace the ldconfig check with a compile test that actually verifies
+if iconv functions are available without additional libraries. This
+correctly detects glibc's built-in iconv while still linking -liconv
+on musl/uclibc systems that need it.
+
+Fixes build on glibc-based systems including OpenWrt glibc targets.
+---
+ Makefile               | 17 +++++++++++++++++
+ prog/sensors/Module.mk |  5 ++++-
+ 2 files changed, 21 insertions(+), 1 deletion(-)
+
+--- a/Makefile
++++ b/Makefile
+@@ -171,6 +171,23 @@ LIBCFLAGS := -fpic -D_REENTRANT $(ALL_CF
+ ALL_LDFLAGS := $(LDFLAGS)
++# Determine iconv linking requirements
++# glibc has built-in iconv, other libc implementations may need -liconv
++ifndef LIBICONV
++  ICONV_TEST := $(shell printf '%s\n' \
++    '#include <iconv.h>' \
++    'int main() { iconv_t cd = iconv_open("UTF-8", "ASCII"); return 0; }' \
++    | $(CC) $(ALL_CPPFLAGS) -x c - -o /tmp/lm_sensors_iconv_test 2>/dev/null && echo "builtin" || echo "external")
++
++  ifeq ($(ICONV_TEST),builtin)
++    LIBICONV :=
++  else
++    LIBICONV := -liconv
++  endif
++
++  $(shell rm -f /tmp/lm_sensors_iconv_test)
++endif
++
+ EXLDFLAGS := -Wl,-rpath,$(LIBDIR) $(ALL_LDFLAGS)
+ .PHONY: all user clean install user_install uninstall user_uninstall
+--- a/prog/sensors/Module.mk
++++ b/prog/sensors/Module.mk
+@@ -39,7 +39,10 @@ REMOVESENSORSBIN := $(patsubst $(MODULE_
+ REMOVESENSORSMAN := $(patsubst $(MODULE_DIR)/%,$(DESTDIR)$(PROGSENSORSMAN1DIR)/%,$(PROGSENSORSMAN1FILES))
+ REMOVESENSORSZSH := $(patsubst $(MODULE_DIR)/%,$(DESTDIR)$(ZSHCOMPDIR)/%,$(PROGSENSORSZSHCOMPFILES))
+-LIBICONV := $(shell if /sbin/ldconfig -p | grep -q '/libiconv\.so$$' ; then echo \-liconv; else echo; fi)
++LIBICONV := $(shell printf '%s\n' \
++  '#include <iconv.h>' \
++  'int main() { iconv_t cd = iconv_open("UTF-8", "ASCII"); return 0; }' \
++  | $(CC) $(ALL_CPPFLAGS) -x c - 2>/dev/null && echo || echo \-liconv)
+ $(PROGSENSORSTARGETS): $(PROGSENSORSSOURCES:.c=.ro) lib/$(LIBDEP_FOR_PROGS)
+       $(CC) $(EXLDFLAGS) -o $@ $(PROGSENSORSSOURCES:.c=.ro) $(LIBICONV) -Llib -lsensors -lm